package com.mach.platform.service;

import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.mach.platform.mapper.FormMapper;
import org.joda.time.*;
import org.joda.time.format.DateTimeFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author Administrator
 * @Description:
 * @Package: com.mach.platform.service
 * @time 2018/11/9 0009 16:29
 */
@Service
public class DataFormServiceImpl {

    @Autowired
    private FormMapper formMapper;

    /**
     * 查数据charts 入口
     * @param param
     * @return
     */
    public Map loadDevChartsDatas (Map param) {

        Map finalMap = Maps.newHashMap();
        String ttype = param.get("lidu").toString();
        String inTime = this.pickUpTargetTimeStamp(param.get("lidu").toString(), param.get("singTime").toString());
        String compTime = this.pickUpTargetTimeStampLiDu(param.get("lidu").toString(), param.get("singTime").toString());
	    String dataType = param.get("dataType").toString();
        param.put("inTime", inTime);
        param.put("compTime", compTime);

        // 以上处理参数，【数据库加载数据】
        List<Map> dbResult = null;
        if ("%Y-%m-%d %H".equals(ttype) || "%Y-%m-%d".equals(ttype) || "%Y-%m".equals(ttype) || "%Y".equals(ttype)) {
            dbResult = formMapper.searchSinglePropertyChartsHour(param);
        }
        if ("%Y-%m-%d %H:%i".equals(ttype)) {
            dbResult = formMapper.searchSinglePropertyChartsMinute(param);
        }

	    // 【处理数据】
	    // 1. legend 数据处理
	    List<String> xData = getLegendData(ttype, param.get("singTime").toString());
	    finalMap.put("xData", xData);
	    List<Object> yData = new ArrayList<>();

	    for (int i = 0; i < xData.size(); i++) {

		    String curTime = xData.get(i);
		    boolean hasToggler = false;
		    for (int j = 0; j < dbResult.size(); j++) {
			    Map curMap = dbResult.get(j);
			    if (curMap.get("timeRecord").toString().equals(curTime)) {
				    if ("瞬时流量".equals(dataType) || "实时流量".equals(dataType)) {
				        yData.add(curMap.get("num"));
				    }
				    if ("累积流量".equals(dataType)) {
				        yData.add(curMap.get("useNum"));
				    }
				    hasToggler = true;
			    	break;
			    }
		    }

		    if (!hasToggler) {
			    yData.add(0);
		    }

	    }

	    finalMap.put("yData", yData);
	    String timeName1 = pickUpTargetTimeStamp(ttype, param.get("singTime").toString());
	    String timeName2 = pickUpTargetTimeName(ttype, param.get("singTime").toString());
	    finalMap.put("title", timeName1+ "  "+timeName2);
	    if ("瞬时流量".equals(dataType)) {
		    finalMap.put("unit", "m³/min");
	    }
	    if ("累积流量".equals(dataType)) {
		    finalMap.put("unit", "m³");
	    }


	    return finalMap;
    }

    /**
     * 用能占比的请求
     * @param param
     * @return
     */
    public Map loadDevChartsDatas2 (Map param) {

        Map finalMap = Maps.newHashMap();
        String ttype = param.get("lidu").toString();

        List<Map> dbResult = loadDevFormDatasGasUsed(param);
        List<String> legend;
        List<Map> datas;
        if (dbResult.size() > 0) {
            // 获取具体的数据
            datas = dbResult.stream().filter(map -> !"车间汇总/供气总管".equals(map.get("name").toString())).map(m -> {
                Map newM = new HashMap(2);
                newM.put("value", m.get("total"));
                newM.put("name", m.get("name"));
                return newM;
            }).collect(Collectors.toList());
            // 从 供气总管-车间汇总  获取 其他的数据
            List<Map> zongGuan = datas.stream()
                    .filter(map -> "供气总管".equals(map.get("name")))
                    .collect(Collectors.toList());
            List<Map> chejian = datas.stream()
                    .filter(map -> "车间汇总".equals(map.get("name")))
                    .collect(Collectors.toList());
            Map otherMap = new HashMap(2);
            otherMap.put("value", new BigDecimal(zongGuan.get(0).get("value").toString()).subtract(new BigDecimal(chejian.get(0).get("value").toString())));
            otherMap.put("name", "其他耗能");
            datas.add(otherMap);

            // 清除不必要的Map
            datas = datas.stream().filter(map -> !"供气总管".equals(map.get("name")) && !"车间汇总".equals(map.get("name"))).collect(Collectors.toList());
            // 提取legend
            legend = datas.stream().sorted(Comparator.comparingDouble(oo -> -Double.parseDouble(oo.get("value").toString()))).map(item -> item.get("name").toString()).collect(Collectors.toList());
            finalMap.put("data", datas);
            finalMap.put("legend", legend);
            String timeName1 = pickUpTargetTimeStamp(ttype, param.get("singTime").toString());
            finalMap.put("title", timeName1 + " 用能占比 ");
            finalMap.put("legend", legend);
        }

        return finalMap;
    }


    /**
     * 用能占比的请求
     * @param param
     * @return
     */
    public Map loadDevChartsDatas3 (Map param) {

        Map finalMap = Maps.newHashMap();
        String ttype = param.get("lidu").toString();

        List<Map> dbResult = loadDevFormDatasGasUsed(param);
        List<String> legend;
        List<Map> datas;
        if (dbResult.size() > 0) {
            // 获取具体的数据
            datas = dbResult.stream().filter(map -> !"车间汇总/供气总管".equals(map.get("name").toString())).map(m -> {
                Map newM = new HashMap(2);
                newM.put("value", m.get("total"));
                newM.put("name", m.get("name"));
                return newM;
            }).collect(Collectors.toList());
            // 从 供气总管-车间汇总  获取 其他的数据
            List<Map> zongGuan = datas.stream()
                    .filter(map -> "供气总管".equals(map.get("name")))
                    .collect(Collectors.toList());
            List<Map> chejian = datas.stream()
                    .filter(map -> "车间汇总".equals(map.get("name")))
                    .collect(Collectors.toList());
            Map otherMap = new HashMap(2);
            otherMap.put("value", new BigDecimal(zongGuan.get(0).get("value").toString()).subtract(new BigDecimal(chejian.get(0).get("value").toString())));
            otherMap.put("name", "其他耗能");
            datas.add(otherMap);

            // 清除不必要的Map
            datas = datas.stream().filter(map -> !"供气总管".equals(map.get("name")) && !"车间汇总".equals(map.get("name"))).collect(Collectors.toList());
            // 提取legend
            legend = datas.stream().sorted(Comparator.comparingDouble(oo -> -Double.parseDouble(oo.get("value").toString()))).map(item -> item.get("name").toString()).collect(Collectors.toList());
            finalMap.put("data", datas);
            finalMap.put("legend", legend);
            String timeName1 = pickUpTargetTimeStamp(ttype, param.get("singTime").toString());
            finalMap.put("title", timeName1 + " 用能占比 ");
            finalMap.put("legend", legend);
        }

        return finalMap;
    }

	public List<String> getLegendData (String mode, String timer) {

		List<String> finalResult = new ArrayList<>();
		String result = "";
        DateTime dateTime = DateTime.parse(timer, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
		DateTime stime = null;
		switch (mode) {
			case "%Y-%m-%d %H:%i":
                 stime = dateTime.minuteOfHour().withMinimumValue().secondOfMinute().withMinimumValue();
                for (int i = 0; i < 60; i++) {
                    if (i > 0) {
                        stime = stime.plusMinutes(1);
                    }
                    String mm = stime.toString("yyyy-MM-dd HH:mm");
                    finalResult.add(mm);
                }
				break;
			case "%Y-%m-%d %H":
				 stime = dateTime.hourOfDay().withMinimumValue();
				for (int i = 0; i < 24; i++) {
					if (i > 0) {
						stime = stime.plusHours(1);
					}
					String mm = stime.toString("yyyy-MM-dd HH");
					finalResult.add(mm);
				}
				break;
			case "%Y-%m-%d":
                int days = dateTime.dayOfMonth().getMaximumValue();
				 stime = dateTime.dayOfMonth().withMinimumValue();
				for (int i = 0; i < days; i++) {
					if (i > 0) {
						stime = stime.plusDays(1);
					}
					String mm = stime.toString("yyyy-MM-dd");
					finalResult.add(mm);
				}
				break;
			case "%Y-%m":
				int months = dateTime.monthOfYear().getMaximumValue();
                 stime = dateTime.monthOfYear().withMinimumValue();
                for (int i = 0; i < months; i++) {
                    if (i > 0) {
                        stime = stime.plusMonths(1);
                    }
                    String mm = stime.toString("yyyy-MM");
                    finalResult.add(mm);
                }
				break;
			default:
				break;
		}

		return finalResult;
	}

    /**
     * 累积用量 各时段粒度 查询入口
     * @param param
     * @return
     */
    public List loadDevFormDatasGasUsed (Map param) {

        String ttype = param.get("lidu").toString();

        String inTime = this.pickUpTargetTimeStamp(param.get("lidu").toString(), param.get("singTime").toString());
        String compTime = this.pickUpTargetTimeStampLiDu(param.get("lidu").toString(), param.get("singTime").toString());
        param.put("inTime", inTime);
        param.put("compTime", compTime);

        List<Map> finalResult = new ArrayList<>();
        List<Map> datass = formMapper.loadDevFormsDatas(param);
        if (datass.size() > 0) {
            List<String> totalDevIds = Lists.newArrayList();
            List<String> totalProperties = Lists.newArrayList();
            // start
            for (int i = 0; i < datass.size(); i++) {
                Map curMap = datass.get(i);
                List<String> curIds = Splitter.on(",").splitToList(curMap.get("ids").toString());
                totalDevIds.addAll(curIds);
                curMap.put("ids", curIds);
                List<String> curProperties = Splitter.on(",").splitToList(curMap.get("properties").toString());
                totalProperties.addAll(curProperties);
                if (i == ( datass.size() - 1 )) {
                    totalProperties = totalProperties.stream().distinct().collect(Collectors.toList());
                }
                curMap.put("properties", curProperties);
            }
            param.put("ids", totalDevIds);
            param.put("properties", totalProperties);

            // 以上处理参数，【数据库加载数据】
            List<Map> dbResult = null;
            if ("%Y-%m-%d %H".equals(ttype) || "%Y-%m-%d".equals(ttype) || "%Y-%m".equals(ttype) || "%Y".equals(ttype)) {//走的时天月
                dbResult = formMapper.useGasByHour(param);
            }
            if ("%Y-%m-%d %H:%i".equals(ttype)) {//走的分数据
                dbResult = formMapper.useGasByMinute(param);
            }

            // 【处理数据】
	        if (dbResult.size() > 0) {
		        finalResult = handlerDataForGasUseForMinute(datass, dbResult, ttype);
	        }
        }


        return finalResult;
    }

    /**
     * 累积用量 各时段粒度 查询入口
     * @param param
     * @return
     */
    public List loadDevFormDatasGasUsed2 (Map param) {
        String ttype = param.get("lidu").toString();
        String [] arr={"冷干机","离心机","螺杆机","末端车间","供气总管"};
            // 以上处理参数，【数据库加载数据】
            List<Map> dbResult = new ArrayList<>();
            if ("%Y-%m-%d".equals(ttype) || "%Y-%m".equals(ttype)) {//走的时  天  月
                for (int i = 0; i <arr.length ; i++) {
                    Random r =new Random();
                    Integer u=r.nextInt(100)+1;
                    Integer v=r.nextInt(20000)+1;
                    Map son = new LinkedHashMap();
                    son.put("name",arr[i]);
                    son.put("total",v);
                    son.put("01",u);
                    son.put("02",u);
                    son.put("03",u);
                    son.put("04",u);
                    son.put("05",u);
                    son.put("06",u);
                    son.put("07",u);
                    son.put("08",u);
                    son.put("09",u);
                    for (int j =10; j < 60; j++) {
                        son.put(String.valueOf(j),u);
                    }
                    dbResult.add(son);
                }
            }
            if ("%Y-%m-%d %H:%i".equals(ttype)||"%Y-%m-%d %H".equals(ttype)) {//走的分数据  时数据
                for (int i = 0; i < arr.length; i++) {
                    Random r = new Random();
                    Integer u = r.nextInt(100) + 1;
                    Integer v = r.nextInt(20000) + 1;
                    Map son = new LinkedHashMap();
                    son.put("name", arr[i]);
                    son.put("total", v);
                    son.put("00", u);
                    son.put("01", u);
                    son.put("02", u);
                    son.put("03", u);
                    son.put("04", u);
                    son.put("05", u);
                    son.put("06", u);
                    son.put("07", u);
                    son.put("08", u);
                    son.put("09", u);
                    for (int j = 10; j < 60; j++) {
                        son.put(String.valueOf(j), u);
                    }
                    dbResult.add(son);
                }
            }
                return dbResult;

    }

    /**
     * 根据粒度获取对应的时间戳
     * @param mode
     * @param timer
     * @return
     */
    public String pickUpTargetTimeStamp (String mode, String timer) {

        String result = "";

        switch (mode) {
            case "%Y-%m-%d %H:%i":
                result = timer.substring(0, 13);
                break;
            case "%Y-%m-%d %H":
                result = timer.substring(0, 11);
                break;
            case "%Y-%m-%d":
                result = timer.substring(0, 7);
                break;
            case "%Y-%m":
                result = timer.substring(0, 4);
                break;
            default:
                break;
        }

        return result;

    }

    /**
     * 根据粒度获取对应的时间戳
     * @param mode
     * @param timer
     * @return
     */
    public String pickUpTargetTimeName (String mode, String timer) {

        String result = "";

        switch (mode) {
            case "%Y-%m-%d %H:%i":
	            result = "分趋势图";
                break;
            case "%Y-%m-%d %H":
                result = "时趋势图";
                break;
            case "%Y-%m-%d":
                result = "天趋势图";
                break;
            case "%Y-%m":
	            result = "月趋势图";
                break;
            default:
                break;
        }

        return result;

    }

    /**
     * 对比的格式
     * @param mode
     * @param timer
     * @return
     */
    public String pickUpTargetTimeStampLiDu (String mode, String timer) {

        String result = "";

        switch (mode) {
            case "%Y-%m-%d %H:%i":
                result = "%Y-%m-%d %H";
                break;
            case "%Y-%m-%d %H":
                result = "%Y-%m-%d";
                break;
            case "%Y-%m-%d":
                result = "%Y-%m";
                break;
            case "%Y-%m":
                result = "%Y";
                break;
            default:
                break;
        }

        return result;

    }


    /**
     * 数据报表总提取入口
     *
     * @param param
     * @return
     */
    public List loadDevFormDatas(Map param) {

        String ttype = param.get("lidu").toString();

        List<Map> finalResult = new ArrayList<>();
        List<Map> datass = formMapper.loadDevFormsDatas(param);
        if (datass.size() > 0) {
            List<String> totalDevIds = Lists.newArrayList();
            List<String> totalProperties = Lists.newArrayList();
            // start
            for (int i = 0; i < datass.size(); i++) {
                Map curMap = datass.get(i);
                List<String> curIds = Splitter.on(",").splitToList(curMap.get("ids").toString());
                totalDevIds.addAll(curIds);
                curMap.put("ids", curIds);
                List<String> curProperties = Splitter.on(",").splitToList(curMap.get("properties").toString());
                totalProperties.addAll(curProperties);
                if (i == (datass.size() - 1)) {
                    totalProperties = totalProperties.stream().distinct().collect(Collectors.toList());
                }
                curMap.put("properties", curProperties);
            }
            param.put("ids", totalDevIds);
            param.put("properties", totalProperties);

            // 以上处理参数，【数据库加载数据】
            List<Map> dbResult = null;
            if ("%Y-%m-%d %H".equals(ttype) || "%Y-%m-%d".equals(ttype) || "%Y-%m".equals(ttype) || "%Y".equals(ttype)) {
                dbResult = formMapper.loadFormDatasHourTable(param);
            }
            if ("%Y-%m-%d %H:%i".equals(ttype)) {
                dbResult = formMapper.loadFormDatasMinuteTable(param);
            }

            // 【处理数据】
            switch (param.get("type").toString()) {
                case "冷干机":
                    finalResult = loadDevFormDataLengGanJi(datass, dbResult);
                    break;
                case "离心机":
                    finalResult = loadDevFormDaasLiXin(datass, dbResult);
                    break;
                case "螺杆机":
                    finalResult = loadDevFormDaasLiXin(datass, dbResult);
                    break;
                case "供气总管":
                    finalResult = loadDevFormDataZongGuan(datass, dbResult);
                    break;
                case "末端车间":
                    finalResult = loadDevFormDataZongGuan(datass, dbResult);
                    break;
                default:

                    break;
            }

        }

        return finalResult;
    }



    /**
     * 数据报表总提取入口2
     *
     * @param param
     * @return
     */
    public List loadDevFormDatas2(Map param) {

        String ttype = param.get("lidu").toString();

        List<Map> finalResult = new ArrayList<>();
        List<Map> datass = formMapper.loadDevFormsDatas(param);
        if (datass.size() > 0) {
            List<String> totalDevIds = Lists.newArrayList();
            List<String> totalProperties = Lists.newArrayList();
            // start
            for (int i = 0; i < datass.size(); i++) {
                Map curMap = datass.get(i);
                List<String> curIds = Splitter.on(",").splitToList(curMap.get("ids").toString());
                totalDevIds.addAll(curIds);
                curMap.put("ids", curIds);
                List<String> curProperties = Splitter.on(",").splitToList(curMap.get("properties").toString());
                totalProperties.addAll(curProperties);
                if (i == (datass.size() - 1)) {
                    totalProperties = totalProperties.stream().distinct().collect(Collectors.toList());
                }
                curMap.put("properties", curProperties);
            }
            param.put("ids", totalDevIds);
            param.put("properties", totalProperties);

            // 以上处理参数，【数据库加载数据】
            List<Map> dbResult = null;
            if ("%Y-%m-%d %H".equals(ttype) || "%Y-%m-%d".equals(ttype) || "%Y-%m".equals(ttype) || "%Y".equals(ttype)) {
                dbResult = formMapper.loadFormDatasHourTable(param);
            }
            if ("%Y-%m-%d %H:%i".equals(ttype)) {
                dbResult = formMapper.loadFormDatasMinuteTable(param);
            }

            // 【处理数据】
            switch (param.get("type").toString()) {
                case "冷干机":
                    finalResult = loadDevFormDataLengGanJi2(datass, dbResult,param);
                    break;
                case "离心机":
                    finalResult = loadDevFormDaasLiXin2(datass, dbResult,param);
                    break;
                case "螺杆机":
                    finalResult = loadDevFormDaasLiXinL(datass, dbResult,param);
                    break;
                case "供气总管":
                    finalResult = loadDevFormDataZongGuan2(datass, dbResult,param);
                    break;
                case "末端车间":
                    finalResult = loadDevFormDataZongGuan2(datass, dbResult,param);
                    break;
                default:

                    break;
            }

        }

        return finalResult;
    }

    /**
     * 冷干机 数据 提取
     *
     * @param datass
     * @param dbResult
     * @return
     */
    public List loadDevFormDataLengGanJi(List<Map> datass, List<Map> dbResult) {

        List<Map> finalResult = new ArrayList<>();


        // 处理提取数据
        for (int i = 0; i < datass.size(); i++) {

            Map target = datass.get(i);
            List<String> targetIds = (List<String>) target.get("ids");
            // 1. 提取单元内的数据  --》 filter
            // 2. 按照时间，进行分组  --》 groupingBy
            Map<Object, List<Map>> groupResult = dbResult.stream().filter(item -> targetIds.contains(item.get("devId").toString())).collect(Collectors.groupingBy(item -> item.get("timeRecord")));
            //3. 提取分组结果的 values，进行数据提取
            int finalI = i;
            List<Map> unitFinalResult = groupResult.values().stream().map(item -> {
                Map son = new LinkedHashMap();
                for (int j = 0; j < item.size(); j++) {
                    if (j == 0) {
                        son.put("name", datass.get(finalI).get("name"));
                        son.put("time", item.get(j).get("timeRecord"));
                        son.put("wip", item.get(j).get("num"));
                    } else if (j == 1) {
                        son.put("wit", item.get(j).get("num"));
                    } else if (j == 2) {
                        son.put("wot", item.get(j).get("num"));
                       // item.get(j).get("num")
                    }
                }
                return son;
            }).sorted(Comparator.comparing(o -> o.get("time").toString())).collect(Collectors.toList());
            finalResult.addAll(unitFinalResult);
        }

        return finalResult;
    }
    /**
     * 冷干机 数据 提取
     *
     * @param datass
     * @param dbResult
     * @return
     */
    public List loadDevFormDataLengGanJi2(List<Map> datass, List<Map> dbResult,Map param) {

        List<Map> finalResult = new ArrayList<>();
         String [] arr={"1#冷干机","2#冷干机","3#冷干机","4#冷干机","5#冷干机","6#冷干机"};
         String tian= param.get("lidu").toString();//查询的是天  %Y-%m-%d
        String yue= param.get("lidu").toString();//%Y-%m  查询的是月
        String fen= param.get("lidu").toString();//%Y-%m-%d %H:%i  查询的是分
        String shi= param.get("lidu").toString();//%Y-%m-%d %H  查询的是shi
        String lenganji= param.get("type").toString();//查询的是冷干机
        String name= param.get("name").toString();//查询的是冷干机下面的冷干机
        // 处理提取数据
        String s=param.get("sTime").toString();
        String [] vm=s.split("");

        String [] srr=s.split("-");
        String snian=srr[0];//获取开始年
        String syue=srr[1];//获取开始月
        String s2=param.get("eTime").toString();
        String [] srr2=s2.split("-");
        String enian=srr2[0];//获取结束年
        String eyue=srr[1];//获取结束月
        String zzz=snian+"-"+syue;  //开始年月
        String sss=enian+"-"+eyue;   //结束年月
        DateTime dateTime1=DateTime.parse(s, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
        DateTime dateTime2=DateTime.parse(s2, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
        int months = Months.monthsBetween(dateTime1, dateTime2).getMonths();
        int Day = Days.daysBetween(dateTime1,dateTime2).getDays();
        List<String> l = new ArrayList();//获取出两个时间段之间的天分
        for (int i = 0; i <Day ; i++) {
            String curTime= dateTime1.plusDays(i).toString("yyyy-MM-dd HH:mm:ss");
            l.add(curTime);
        }
        int hours= Hours.hoursBetween(dateTime1,dateTime2).getHours();
        List ho = new ArrayList();//获取出两个时间段之间的小时
        for (int i = 0; i <hours ; i++) {
            String curTime= dateTime1.plusHours(i).toString("yyyy-MM-dd HH:mm:ss");
            ho.add(curTime);
        }
        List<Map> result = Lists.newArrayList();
        List<String> list = new LinkedList<>();//获取出两个时间段之间的月份
        Random random=new Random();
        for (int i = 0; i <= months; i++) {
            Map curMap=new HashMap();
            String curTime = dateTime1.plusMonths(i).toString("yyyy-MM-dd HH:mm:ss");
            curMap.put("time",curTime);
            list.add(curTime);

        }
        int minute= Minutes.minutesBetween(dateTime1,dateTime2).getMinutes();////获取出两个时间段之间的分

        List mi = new ArrayList();
        for (int i = 0; i <minute ; i++) {
            String curTime= dateTime1.plusMinutes(i).toString("yyyy-MM-dd HH:mm:ss");
            mi.add(curTime);
        }





                    for (int o = 0; o <list.size() ; o++) {
            if (yue.equals("%Y-%m")) {
                //查询的是月
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();
                BigDecimal bg = new BigDecimal(d);
                double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                Integer s3= r.nextInt(30)+1;
                for (int i = 0; i <arr.length ; i++) {
                    if(name.equals("")||name==null){
                        son.put("name", arr[i]);
                    }else{
                        son.put("name", name);
                    }
                }


               String [] am= list.get(o).split("-");
                son.put("time", am[0]+"-"+am[1]);
                son.put("wip", f1);
                son.put("wit", s3);
                son.put("wot", s3);
                finalResult.add(son);
            }
        }


                   for (int i = 0; i <ho.size() ; i++) {
                       if (shi.equals("%Y-%m-%d %H")) {//查询的是时 %Y-%m-%d %H
                           Random r = new Random();
                           Double d= r.nextDouble();
                           BigDecimal bg = new BigDecimal(d);
                           double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                           Integer s3= r.nextInt(30)+1;
                           Map son = new LinkedHashMap();
                           if(name.equals("")||name==null){
                               son.put("name", "3#冷干机");
                           }else{
                               son.put("name", name);
                           }
                           son.put("time", ho.get(i));
                           son.put("wip", f1);
                           son.put("wit", s3);
                           son.put("wot", s3);
                           finalResult.add(son);
                       }
        }

        for (int i = 0; i <mi.size() ; i++) {
            if (fen.equals("%Y-%m-%d %H:%i")) {//查询的是分
                Random r = new Random();
                Double d= r.nextDouble();
                BigDecimal bg = new BigDecimal(d);
                double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                Integer s3= r.nextInt(30)+1;
                Map son = new LinkedHashMap();
                if(name.equals("")||name==null){
                    son.put("name", "3#冷干机");
                }else{
                    son.put("name", name);
                }
                son.put("time", mi.get(i));
                son.put("wip", f1);
                son.put("wit", s3);
                son.put("wot", s3);
                finalResult.add(son);
            }
        }
        for (int i = 0; i <l.size() ; i++) {
            if (fen.equals("%Y-%m-%d")) {//查询的是天
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();
                BigDecimal bg = new BigDecimal(d);
                double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                Integer s3= r.nextInt(30)+1;
               if(name.equals("")||name==null){
                   son.put("name", "3#冷干机");
               }else{
                   son.put("name", name);
               }
               String [] mk= l.get(i).split(" ");
                son.put("time", mk[0]);
                son.put("wip", f1);
                son.put("wit", s3);
                son.put("wot", s3);
                finalResult.add(son);

            }
        }




        return finalResult;
    }

    /**
     * 离心机 ---  螺杆机  数据提取
     *
     * @param datass
     * @param dbResult
     * @return
     */
    public List loadDevFormDaasLiXin(List<Map> datass, List<Map> dbResult) {

        List<Map> finalResult = new ArrayList<>();

        // 处理提取数据
        for (int i = 0; i < datass.size(); i++) {
            Map target = datass.get(i);
            List<String> targetIds = (List<String>) target.get("ids");
            // 1. 提取单元内的数据  --》 filter
            // 2. 按照时间，进行分组  --》 groupingBy
            Map<Object, List<Map>> groupResult = dbResult.stream().filter(item -> targetIds.contains(item.get("devId").toString())).collect(Collectors.groupingBy(item -> item.get("timeRecord")));
            //3. 提取分组结果的 values，进行数据提取
            int finalI = i;
            List<Map> unitFinalResult = groupResult.values().stream().map(item -> {
                Map son = new LinkedHashMap();
                for (int j = 0; j < item.size(); j++) {
                    if (j == 0) {
                        son.put("名字", datass.get(finalI).get("name"));
                        son.put("粒度", item.get(j).get("timeRecord"));
                        son.put("wip", item.get(j).get("num"));
                    } else if (j == 1) {
                        son.put("wit", item.get(j).get("num"));
                    } else if (j == 2) {
                        son.put("wot", item.get(j).get("num"));
                    } else {
                        son.put(item.get(j).get("dataType"), item.get(j).get("num"));
                    }
                }
                return son;
            }).sorted(Comparator.comparing(o -> o.get("粒度").toString())).collect(Collectors.toList());
            finalResult.addAll(unitFinalResult);

        }

        return finalResult;

    }



    /**
     * 离心机 ---  螺杆机  数据提取
     *
     * @param datass
     * @param dbResult
     * @return
     */
    public List loadDevFormDaasLiXin2(List<Map> datass, List<Map> dbResult,Map param) {

        List<Map> finalResult = new ArrayList<>();
        String [] arr={"1#冷干机","2#冷干机","3#冷干机","4#冷干机","5#冷干机","6#冷干机"};
        String tian= param.get("lidu").toString();//查询的是天  %Y-%m-%d
        String yue= param.get("lidu").toString();//%Y-%m  查询的是月
        String fen= param.get("lidu").toString();//%Y-%m-%d %H:%i  查询的是分
        String shi= param.get("lidu").toString();//%Y-%m-%d %H  查询的是shi
        String lenganji= param.get("type").toString();//查询的是冷干机
        String name= param.get("name").toString();//查询的是冷干机下面的冷干机
        // 处理提取数据
        String s=param.get("sTime").toString();
        String [] vm=s.split("");

        String [] srr=s.split("-");
        String snian=srr[0];//获取开始年
        String syue=srr[1];//获取开始月
        String s2=param.get("eTime").toString();
        String [] srr2=s2.split("-");
        String enian=srr2[0];//获取结束年
        String eyue=srr[1];//获取结束月
        String zzz=snian+"-"+syue;  //开始年月
        String sss=enian+"-"+eyue;   //结束年月
        DateTime dateTime1=DateTime.parse(s, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
        DateTime dateTime2=DateTime.parse(s2, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
        int months = Months.monthsBetween(dateTime1, dateTime2).getMonths();
        int Day = Days.daysBetween(dateTime1,dateTime2).getDays();
        List l = new ArrayList();//获取出两个时间段之间的天分
        for (int i = 0; i <Day ; i++) {
            String curTime= dateTime1.plusDays(i).toString("yyyy-MM-dd HH:mm:ss");
            l.add(curTime);
        }
        int hours= Hours.hoursBetween(dateTime1,dateTime2).getHours();
        List<String> ho = new ArrayList();//获取出两个时间段之间的小时
        for (int i = 0; i <hours ; i++) {
            String curTime= dateTime1.plusHours(i).toString("yyyy-MM-dd HH:mm:ss");
            ho.add(curTime);
        }
        List<Map> result = Lists.newArrayList();
        List<String> list = new LinkedList<>();//获取出两个时间段之间的月份
        Random random=new Random();
        for (int i = 0; i <= months; i++) {
            Map curMap=new HashMap();
            String curTime = dateTime1.plusMonths(i).toString("yyyy-MM-dd HH:mm:ss");
            curMap.put("time",curTime);
            list.add(curTime);

        }
        int minute= Minutes.minutesBetween(dateTime1,dateTime2).getMinutes();////获取出两个时间段之间的分

        List mi = new ArrayList();
        for (int i = 0; i <minute ; i++) {
            String curTime= dateTime1.plusMinutes(i).toString("yyyy-MM-dd HH:mm:ss");
            mi.add(curTime);
        }





        for (int o = 0; o <list.size() ; o++) {
            if (yue.equals("%Y-%m")) {
                //查询的是月
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();

                Integer s3= r.nextInt(30)+1;



                String [] am= list.get(o).split("-");

                if(name==null||name.equals("")){
                    son.put("名字", "2#离心机");
                }else{
                    son.put("名字", name);
                }

                son.put("粒度", am[0]+"-"+am[1]);
                son.put("wip", s3);//进水压强
                son.put("冷却器1冷却温差",s3);
                son.put("冷却器2冷却温差",s3);
                son.put("主机2进口温度",s3);
                son.put("储油箱温度",s3);
                son.put("冷却水进",s3);
                son.put("齿轮箱供油温度",s3);
                son.put("wit", s3);//进水温度
                son.put("wot", s3);//回水温度
                son.put("冷却器3冷却温差", s3);
                son.put("压缩空气出口温度", s3);
                son.put("压缩空气出口压力", s3);
                son.put("齿轮箱油压", s3);
                son.put("驱动电机温度", s3);
                son.put("压缩空气出口压力", s3);
                //空气过滤器压差    主机2进口温度  主机3出口压力
                son.put("空气过滤器压差",s3);
                son.put("主机3进口温度",s3);
                son.put("主机3出口压力",s3);





                finalResult.add(son);
            }
        }


        for (int i = 0; i <ho.size() ; i++) {
            if (shi.equals("%Y-%m-%d %H")) {//查询的是时 %Y-%m-%d %H
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();

                Integer s3= r.nextInt(30)+1;






                if(name==null||name.equals("")){
                    son.put("名字", "2#离心机");
                }else{
                    son.put("名字", name);
                }
                son.put("粒度", ho.get(i));
                son.put("wip", s3);//进水压强
                son.put("冷却器1冷却温差",s3);
                son.put("冷却器2冷却温差",s3);
                son.put("主机2进口温度",s3);
                son.put("储油箱温度",s3);
                son.put("冷却水进",s3);
                son.put("齿轮箱供油温度",s3);
                son.put("wit", s3);//进水温度
                son.put("wot", s3);//回水温度
                son.put("冷却器3冷却温差", s3);
                son.put("压缩空气出口温度", s3);
                son.put("压缩空气出口压力", s3);
                son.put("齿轮箱油压", s3);
                son.put("驱动电机温度", s3);
                son.put("压缩空气出口压力", s3);
                //空气过滤器压差    主机2进口温度  主机3出口压力
                son.put("空气过滤器压差",s3);
                son.put("主机3进口温度",s3);
                son.put("主机3出口压力",s3);





                finalResult.add(son);
            }
        }

        for (int i = 0; i <mi.size() ; i++) {
            if (fen.equals("%Y-%m-%d %H:%i")) {//查询的是分
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();
                Integer s3= r.nextInt(30)+1;
                if(name==null||name.equals("")){
                    son.put("名字", "2#离心机");
                }else{
                    son.put("名字", name);
                }
                son.put("粒度", mi.get(i));
                son.put("wip", s3);//进水压强
                son.put("冷却器1冷却温差",s3);
                son.put("冷却器2冷却温差",s3);
                son.put("主机2进口温度",s3);
                son.put("储油箱温度",s3);
                son.put("冷却水进",s3);
                son.put("齿轮箱供油温度",s3);
                son.put("wit", s3);//进水温度
                son.put("wot", s3);//回水温度
                son.put("冷却器3冷却温差", s3);
                son.put("压缩空气出口温度", s3);
                son.put("压缩空气出口压力", s3);
                son.put("齿轮箱油压", s3);
                son.put("驱动电机温度", s3);
                son.put("压缩空气出口压力", s3);
                //空气过滤器压差    主机2进口温度  主机3出口压力
                son.put("空气过滤器压差",s3);
                son.put("主机3进口温度",s3);
                son.put("主机3出口压力",s3);
                finalResult.add(son);
            }
        }
        for (int i = 0; i <l.size() ; i++) {
            if (fen.equals("%Y-%m-%d")) {//查询的是天
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();
                Integer s3= r.nextInt(30)+1;
                if(name==null||name.equals("")){
                    son.put("名字", "2#离心机");
                }else{
                    son.put("名字", name);
                }
                son.put("粒度", l.get(i));
                son.put("wip", s3);//进水压强
                son.put("冷却器1冷却温差",s3);
                son.put("冷却器2冷却温差",s3);
                son.put("主机2进口温度",s3);
                son.put("储油箱温度",s3);
                son.put("冷却水进",s3);
                son.put("齿轮箱供油温度",s3);
                son.put("wit", s3);//进水温度
                son.put("wot", s3);//回水温度
                son.put("冷却器3冷却温差", s3);
                son.put("压缩空气出口温度", s3);
                son.put("压缩空气出口压力", s3);
                son.put("齿轮箱油压", s3);
                son.put("驱动电机温度", s3);
                son.put("压缩空气出口压力", s3);
                //空气过滤器压差    主机2进口温度  主机3出口压力
                son.put("空气过滤器压差",s3);
                son.put("主机3进口温度",s3);
                son.put("主机3出口压力",s3);
                finalResult.add(son);

            }
        }

        return finalResult;

    }




    /**
     * 离心机 ---  螺杆机  数据提取
     *
     * @param datass
     * @param dbResult
     * @return
     */
    public List loadDevFormDaasLiXin(List<Map> datass, List<Map> dbResult,Map param) {


        List<Map> finalResult = new ArrayList<>();
        String [] arr={"1#冷干机","2#冷干机","3#冷干机","4#冷干机","5#冷干机","6#冷干机"};
        String tian= param.get("lidu").toString();//查询的是天  %Y-%m-%d
        String yue= param.get("lidu").toString();//%Y-%m  查询的是月
        String fen= param.get("lidu").toString();//%Y-%m-%d %H:%i  查询的是分
        String shi= param.get("lidu").toString();//%Y-%m-%d %H  查询的是shi
        String lenganji= param.get("type").toString();//查询的是冷干机
        String name= param.get("name").toString();//查询的是冷干机下面的冷干机
        // 处理提取数据
        String s=param.get("sTime").toString();
        String [] vm=s.split("");

        String [] srr=s.split("-");
        String snian=srr[0];//获取开始年
        String syue=srr[1];//获取开始月
        String s2=param.get("eTime").toString();
        String [] srr2=s2.split("-");
        String enian=srr2[0];//获取结束年
        String eyue=srr[1];//获取结束月
        String zzz=snian+"-"+syue;  //开始年月
        String sss=enian+"-"+eyue;   //结束年月
        DateTime dateTime1=DateTime.parse(s, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
        DateTime dateTime2=DateTime.parse(s2, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
        int months = Months.monthsBetween(dateTime1, dateTime2).getMonths();
        int Day = Days.daysBetween(dateTime1,dateTime2).getDays();
        List l = new ArrayList();//获取出两个时间段之间的天分
        for (int i = 0; i <Day ; i++) {
            String curTime= dateTime1.plusDays(i).toString("yyyy-MM-dd HH:mm:ss");
            l.add(curTime);
        }
        int hours= Hours.hoursBetween(dateTime1,dateTime2).getHours();
        List<String> ho = new ArrayList();//获取出两个时间段之间的小时
        for (int i = 0; i <hours ; i++) {
            String curTime= dateTime1.plusHours(i).toString("yyyy-MM-dd HH:mm:ss");
            ho.add(curTime);
        }
        List<Map> result = Lists.newArrayList();
        List<String> list = new LinkedList<>();//获取出两个时间段之间的月份
        Random random=new Random();
        for (int i = 0; i <= months; i++) {
            Map curMap=new HashMap();
            String curTime = dateTime1.plusMonths(i).toString("yyyy-MM-dd HH:mm:ss");
            curMap.put("time",curTime);
            list.add(curTime);

        }
        int minute= Minutes.minutesBetween(dateTime1,dateTime2).getMinutes();////获取出两个时间段之间的分

        List mi = new ArrayList();
        for (int i = 0; i <minute ; i++) {
            String curTime= dateTime1.plusMinutes(i).toString("yyyy-MM-dd HH:mm:ss");
            mi.add(curTime);
        }





        for (int o = 0; o <list.size() ; o++) {
            if (yue.equals("%Y-%m")) {
                //查询的是月
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();

                Integer s3= r.nextInt(30)+1;



                String [] am= list.get(o).split("-");

                if(name==null||name.equals("")){
                    son.put("名字", "2#离心机");
                }else{
                    son.put("名字", name);
                }

                son.put("粒度", am[0]+"-"+am[1]);
                son.put("wip", s3);//进水压强
                son.put("冷却器1冷却温差",s3);
                son.put("冷却器2冷却温差",s3);
                son.put("主机2进口温度",s3);
                son.put("储油箱温度",s3);
                son.put("冷却水进",s3);
                son.put("齿轮箱供油温度",s3);
                son.put("wit", s3);//进水温度
                son.put("wot", s3);//回水温度
                son.put("冷却器3冷却温差", s3);
                son.put("压缩空气出口温度", s3);
                son.put("压缩空气出口压力", s3);
                son.put("齿轮箱油压", s3);
                son.put("驱动电机温度", s3);
                son.put("压缩空气出口压力", s3);
                //空气过滤器压差    主机2进口温度  主机3出口压力
                son.put("空气过滤器压差",s3);
                son.put("主机3进口温度",s3);
                son.put("主机3出口压力",s3);





                finalResult.add(son);
            }
        }


        for (int i = 0; i <ho.size() ; i++) {
            if (shi.equals("%Y-%m-%d %H")) {//查询的是时 %Y-%m-%d %H
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();

                Integer s3= r.nextInt(30)+1;






                if(name==null||name.equals("")){
                    son.put("名字", "2#离心机");
                }else{
                    son.put("名字", name);
                }
                son.put("粒度", ho.get(i));
                son.put("wip", s3);//进水压强
                son.put("冷却器1冷却温差",s3);
                son.put("冷却器2冷却温差",s3);
                son.put("主机2进口温度",s3);
                son.put("储油箱温度",s3);
                son.put("冷却水进",s3);
                son.put("齿轮箱供油温度",s3);
                son.put("wit", s3);//进水温度
                son.put("wot", s3);//回水温度
                son.put("冷却器3冷却温差", s3);
                son.put("压缩空气出口温度", s3);
                son.put("压缩空气出口压力", s3);
                son.put("齿轮箱油压", s3);
                son.put("驱动电机温度", s3);
                son.put("压缩空气出口压力", s3);
                //空气过滤器压差    主机2进口温度  主机3出口压力
                son.put("空气过滤器压差",s3);
                son.put("主机3进口温度",s3);
                son.put("主机3出口压力",s3);





                finalResult.add(son);
            }
        }

        for (int i = 0; i <mi.size() ; i++) {
            if (fen.equals("%Y-%m-%d %H:%i")) {//查询的是分
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();
                Integer s3= r.nextInt(30)+1;
                if(name==null||name.equals("")){
                    son.put("名字", "2#离心机");
                }else{
                    son.put("名字", name);
                }
                son.put("粒度", mi.get(i));
                son.put("wip", s3);//进水压强
                son.put("冷却器1冷却温差",s3);
                son.put("冷却器2冷却温差",s3);
                son.put("主机2进口温度",s3);
                son.put("储油箱温度",s3);
                son.put("冷却水进",s3);
                son.put("齿轮箱供油温度",s3);
                son.put("wit", s3);//进水温度
                son.put("wot", s3);//回水温度
                son.put("冷却器3冷却温差", s3);
                son.put("压缩空气出口温度", s3);
                son.put("压缩空气出口压力", s3);
                son.put("齿轮箱油压", s3);
                son.put("驱动电机温度", s3);
                son.put("压缩空气出口压力", s3);
                //空气过滤器压差    主机2进口温度  主机3出口压力
                son.put("空气过滤器压差",s3);
                son.put("主机3进口温度",s3);
                son.put("主机3出口压力",s3);
                finalResult.add(son);
            }
        }
        for (int i = 0; i <l.size() ; i++) {
            if (fen.equals("%Y-%m-%d")) {//查询的是天
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();
                Integer s3= r.nextInt(30)+1;
                if(name==null||name.equals("")){
                    son.put("名字", "2#离心机");
                }else{
                    son.put("名字", name);
                }
                son.put("粒度", l.get(i));
                son.put("wip", s3);//进水压强
                son.put("冷却器1冷却温差",s3);
                son.put("冷却器2冷却温差",s3);
                son.put("主机2进口温度",s3);
                son.put("储油箱温度",s3);
                son.put("冷却水进",s3);
                son.put("齿轮箱供油温度",s3);
                son.put("wit", s3);//进水温度
                son.put("wot", s3);//回水温度
                son.put("冷却器3冷却温差", s3);
                son.put("压缩空气出口温度", s3);
                son.put("压缩空气出口压力", s3);
                son.put("齿轮箱油压", s3);
                son.put("驱动电机温度", s3);
                son.put("压缩空气出口压力", s3);
                //空气过滤器压差    主机2进口温度  主机3出口压力
                son.put("空气过滤器压差",s3);
                son.put("主机3进口温度",s3);
                son.put("主机3出口压力",s3);
                finalResult.add(son);

            }
        }

        return finalResult;

    }

















    //螺杆机


    /**
     * 螺杆机  数据提取
     *
     * @param datass
     * @param dbResult
     * @return
     */
    public List loadDevFormDaasLiXinL(List<Map> datass, List<Map> dbResult,Map param) {


        List<Map> finalResult = new ArrayList<>();
        String [] arr={"1#冷干机","2#冷干机","3#冷干机","4#冷干机","5#冷干机","6#冷干机"};
        String tian= param.get("lidu").toString();//查询的是天  %Y-%m-%d
        String yue= param.get("lidu").toString();//%Y-%m  查询的是月
        String fen= param.get("lidu").toString();//%Y-%m-%d %H:%i  查询的是分
        String shi= param.get("lidu").toString();//%Y-%m-%d %H  查询的是shi
        String lenganji= param.get("type").toString();//查询的是冷干机
        String name= param.get("name").toString();//查询的是冷干机下面的冷干机
        // 处理提取数据
        String s=param.get("sTime").toString();
        String [] vm=s.split("");

        String [] srr=s.split("-");
        String snian=srr[0];//获取开始年
        String syue=srr[1];//获取开始月
        String s2=param.get("eTime").toString();
        String [] srr2=s2.split("-");
        String enian=srr2[0];//获取结束年
        String eyue=srr[1];//获取结束月
        String zzz=snian+"-"+syue;  //开始年月
        String sss=enian+"-"+eyue;   //结束年月
        DateTime dateTime1=DateTime.parse(s, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
        DateTime dateTime2=DateTime.parse(s2, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
        int months = Months.monthsBetween(dateTime1, dateTime2).getMonths();
        int Day = Days.daysBetween(dateTime1,dateTime2).getDays();
        List l = new ArrayList();//获取出两个时间段之间的天分
        for (int i = 0; i <Day ; i++) {
            String curTime= dateTime1.plusDays(i).toString("yyyy-MM-dd HH:mm:ss");
            l.add(curTime);
        }
        int hours= Hours.hoursBetween(dateTime1,dateTime2).getHours();
        List<String> ho = new ArrayList();//获取出两个时间段之间的小时
        for (int i = 0; i <hours ; i++) {
            String curTime= dateTime1.plusHours(i).toString("yyyy-MM-dd HH:mm:ss");
            ho.add(curTime);
        }
        List<Map> result = Lists.newArrayList();
        List<String> list = new LinkedList<>();//获取出两个时间段之间的月份
        Random random=new Random();
        for (int i = 0; i <= months; i++) {
            Map curMap=new HashMap();
            String curTime = dateTime1.plusMonths(i).toString("yyyy-MM-dd HH:mm:ss");
            curMap.put("time",curTime);
            list.add(curTime);

        }
        int minute= Minutes.minutesBetween(dateTime1,dateTime2).getMinutes();////获取出两个时间段之间的分

        List mi = new ArrayList();
        for (int i = 0; i <minute ; i++) {
            String curTime= dateTime1.plusMinutes(i).toString("yyyy-MM-dd HH:mm:ss");
            mi.add(curTime);
        }





        for (int o = 0; o <list.size() ; o++) {
            if (yue.equals("%Y-%m")) {
                //查询的是月
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();

                Integer s3= r.nextInt(30)+1;



                String [] am= list.get(o).split("-");

                if(name==null||name.equals("")){
                    son.put("名字", "2#螺杆机");
                }else{
                    son.put("名字", name);
                }

                son.put("粒度", am[0]+"-"+am[1]);
                son.put("wip", s3);//进水压强
                son.put("冷却器1冷却温差",s3);
                son.put("冷却器2冷却温差",s3);
                son.put("主机2进口温度",s3);
                son.put("储油箱温度",s3);
                son.put("冷却水进",s3);
                son.put("齿轮箱供油温度",s3);
                son.put("wit", s3);//进水温度
                son.put("wot", s3);//回水温度
                son.put("冷却器3冷却温差", s3);
                son.put("压缩空气出口温度", s3);
                son.put("压缩空气出口压力", s3);
                son.put("齿轮箱油压", s3);
                son.put("驱动电机温度", s3);
                son.put("压缩空气出口压力", s3);
                //空气过滤器压差    主机2进口温度  主机3出口压力
                son.put("空气过滤器压差",s3);
                son.put("主机3进口温度",s3);
                son.put("主机3出口压力",s3);

                son.put("油温", s3);
               son.put("低压冷却水温差",s3);
               son.put("出口温度",s3);
                son.put("出口压力",s3);
                son.put("油压",s3);
                son.put("中冷器",s3);
                son.put("冷却水出温",s3);
                son.put("低压冷却水出温",s3);
                son.put("主机1出口温度",s3);
                son.put("主机2出口温度",s3);




                finalResult.add(son);
            }
        }


        for (int i = 0; i <ho.size() ; i++) {
            if (shi.equals("%Y-%m-%d %H")) {//查询的是时 %Y-%m-%d %H
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();

                Integer s3= r.nextInt(30)+1;






                if(name==null||name.equals("")){
                    son.put("名字", "2#螺杆机");
                }else{
                    son.put("名字", name);
                }
                son.put("粒度", ho.get(i));
                son.put("wip", s3);//进水压强
                son.put("冷却器1冷却温差",s3);
                son.put("冷却器2冷却温差",s3);
                son.put("主机2进口温度",s3);
                son.put("储油箱温度",s3);
                son.put("冷却水进",s3);
                son.put("齿轮箱供油温度",s3);
                son.put("wit", s3);//进水温度
                son.put("wot", s3);//回水温度
                son.put("冷却器3冷却温差", s3);
                son.put("压缩空气出口温度", s3);
                son.put("压缩空气出口压力", s3);
                son.put("齿轮箱油压", s3);
                son.put("驱动电机温度", s3);
                son.put("压缩空气出口压力", s3);
                //空气过滤器压差    主机2进口温度  主机3出口压力
                son.put("空气过滤器压差",s3);
                son.put("主机3进口温度",s3);
                son.put("主机3出口压力",s3);
                son.put("油温", s3);
                son.put("低压冷却水温差",s3);
                son.put("出口温度",s3);
                son.put("出口压力",s3);
                son.put("油压",s3);
                son.put("中冷器",s3);
                son.put("冷却水出温",s3);
                son.put("低压冷却水出温",s3);
                son.put("主机1出口温度",s3);
                son.put("主机2出口温度",s3);





                finalResult.add(son);
            }
        }

        for (int i = 0; i <mi.size() ; i++) {
            if (fen.equals("%Y-%m-%d %H:%i")) {//查询的是分
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();
                Integer s3= r.nextInt(30)+1;
                if(name==null||name.equals("")){
                    son.put("名字", "2#螺杆机");
                }else{
                    son.put("名字", name);
                }
                son.put("粒度", mi.get(i));
                son.put("wip", s3);//进水压强
                son.put("冷却器1冷却温差",s3);
                son.put("冷却器2冷却温差",s3);
                son.put("主机2进口温度",s3);
                son.put("储油箱温度",s3);
                son.put("冷却水进",s3);
                son.put("齿轮箱供油温度",s3);
                son.put("wit", s3);//进水温度
                son.put("wot", s3);//回水温度
                son.put("冷却器3冷却温差", s3);
                son.put("压缩空气出口温度", s3);
                son.put("压缩空气出口压力", s3);
                son.put("齿轮箱油压", s3);
                son.put("驱动电机温度", s3);
                son.put("压缩空气出口压力", s3);
                //空气过滤器压差    主机2进口温度  主机3出口压力
                son.put("空气过滤器压差",s3);
                son.put("主机3进口温度",s3);
                son.put("主机3出口压力",s3);
                son.put("油温", s3);
                son.put("低压冷却水温差",s3);
                son.put("出口温度",s3);
                son.put("出口压力",s3);
                son.put("油压",s3);
                son.put("中冷器",s3);
                son.put("冷却水出温",s3);
                son.put("低压冷却水出温",s3);
                son.put("主机1出口温度",s3);
                son.put("主机2出口温度",s3);
                finalResult.add(son);
            }
        }
        for (int i = 0; i <l.size() ; i++) {
            if (fen.equals("%Y-%m-%d")) {//查询的是天
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();
                Integer s3= r.nextInt(30)+1;
                if(name==null||name.equals("")){
                    son.put("名字", "2#螺杆机");
                }else{
                    son.put("名字", name);
                }
                son.put("粒度", l.get(i));
                son.put("wip", s3);//进水压强
                son.put("冷却器1冷却温差",s3);
                son.put("冷却器2冷却温差",s3);
                son.put("主机2进口温度",s3);
                son.put("储油箱温度",s3);
                son.put("冷却水进",s3);
                son.put("齿轮箱供油温度",s3);
                son.put("wit", s3);//进水温度
                son.put("wot", s3);//回水温度
                son.put("冷却器3冷却温差", s3);
                son.put("压缩空气出口温度", s3);
                son.put("压缩空气出口压力", s3);
                son.put("齿轮箱油压", s3);
                son.put("驱动电机温度", s3);
                son.put("压缩空气出口压力", s3);
                //空气过滤器压差    主机2进口温度  主机3出口压力
                son.put("空气过滤器压差",s3);
                son.put("主机3进口温度",s3);
                son.put("主机3出口压力",s3);
                son.put("油温", s3);
                son.put("低压冷却水温差",s3);
                son.put("出口温度",s3);
                son.put("出口压力",s3);
                son.put("油压",s3);
                son.put("中冷器",s3);
                son.put("冷却水出温",s3);
                son.put("低压冷却水出温",s3);
                son.put("主机1出口温度",s3);
                son.put("主机2出口温度",s3);
                finalResult.add(son);

            }
        }

        return finalResult;

    }






    /**
     * 供气总管 末端减压 --- 数据 提取
     *
     * @param datass
     * @param dbResult
     * @return
     */
    public List loadDevFormDataZongGuan(List<Map> datass, List<Map> dbResult) {

        List<Map> finalResult = new ArrayList<>();

        // 处理提取数据
        for (int i = 0; i < datass.size(); i++) {
            Map target = datass.get(i);
            List<String> targetIds = (List<String>) target.get("ids");
            // 1. 提取单元内的数据  --》 filter
            // 2. 按照时间，进行分组  --》 groupingBy
            Map<Object, List<Map>> groupResult = dbResult.stream().filter(item -> targetIds.contains(item.get("devId").toString())).collect(Collectors.groupingBy(item -> item.get("timeRecord")));
            //3. 提取分组结果的 values，进行数据提取
            //3. 提取分组结果的 values，进行数据提取
            int finalI = i;
            List<Map> unitFinalResult = groupResult.values().stream().map(item -> {
                Map son = new LinkedHashMap();
                for (int j = 0; j < item.size(); j++) {
                    System.out.println(item.get(j)+"00000000000000wo");
                    if (j == 0) {
                        son.put("名字", datass.get(finalI).get("name") == null ? datass.get(finalI).get("type") : datass.get(finalI).get("name") );
                        son.put("粒度", item.get(j).get("timeRecord"));
                    } else {
                        son.put(item.get(j).get("dataType"), "累积流量".equals(item.get(j).get("dataType").toString()) ? new BigDecimal(item.get(j).get("useNum").toString()).setScale(1, RoundingMode.HALF_UP) : new BigDecimal(
                                item.get(j).get("num").toString()).setScale(2, RoundingMode.HALF_UP));
                    }
                }
                return son;
            }).sorted(Comparator.comparing(o -> o.get("粒度").toString())).collect(Collectors.toList());
            finalResult.addAll(unitFinalResult);

        }

        return finalResult;

    }




    /**
     * 末端车间压 --- 数据 提取
     *
     * @param datass
     * @param dbResult
     * @return
     */
    public List loadDevFormDataZongGuan2(List<Map> datass, List<Map> dbResult,Map param) {

        List<Map> finalResult = new ArrayList<>();
        String [] arr={"1#冷干机","2#冷干机","3#冷干机","4#冷干机","5#冷干机","6#冷干机"};
        String tian= param.get("lidu").toString();//查询的是天  %Y-%m-%d
        String yue= param.get("lidu").toString();//%Y-%m  查询的是月
        String fen= param.get("lidu").toString();//%Y-%m-%d %H:%i  查询的是分
        String shi= param.get("lidu").toString();//%Y-%m-%d %H  查询的是shi
        String lenganji= param.get("type").toString();//查询的是冷干机
        String name= param.get("name").toString();//查询的是冷干机下面的冷干机
        // 处理提取数据
        String s=param.get("sTime").toString();
        String [] vm=s.split("");

        String [] srr=s.split("-");
        String snian=srr[0];//获取开始年
        String syue=srr[1];//获取开始月
        String s2=param.get("eTime").toString();
        String [] srr2=s2.split("-");
        String enian=srr2[0];//获取结束年
        String eyue=srr[1];//获取结束月
        String zzz=snian+"-"+syue;  //开始年月
        String sss=enian+"-"+eyue;   //结束年月
        DateTime dateTime1=DateTime.parse(s, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
        DateTime dateTime2=DateTime.parse(s2, DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
        int months = Months.monthsBetween(dateTime1, dateTime2).getMonths();
        int Day = Days.daysBetween(dateTime1,dateTime2).getDays();
        List<String> l = new ArrayList();//获取出两个时间段之间的天分
        for (int i = 0; i <Day ; i++) {
            String curTime= dateTime1.plusDays(i).toString("yyyy-MM-dd HH:mm:ss");
            l.add(curTime);
        }
        int hours= Hours.hoursBetween(dateTime1,dateTime2).getHours();
        List ho = new ArrayList();//获取出两个时间段之间的小时
        for (int i = 0; i <hours ; i++) {
            String curTime= dateTime1.plusHours(i).toString("yyyy-MM-dd HH:mm:ss");
            ho.add(curTime);
        }
        List<Map> result = Lists.newArrayList();
        List<String> list = new LinkedList<>();//获取出两个时间段之间的月份
        Random random=new Random();
        for (int i = 0; i <= months; i++) {
            Map curMap=new HashMap();
            String curTime = dateTime1.plusMonths(i).toString("yyyy-MM-dd HH:mm:ss");
            curMap.put("time",curTime);
            list.add(curTime);

        }
        int minute= Minutes.minutesBetween(dateTime1,dateTime2).getMinutes();////获取出两个时间段之间的分

        List mi = new ArrayList();
        for (int i = 0; i <minute ; i++) {
            String curTime= dateTime1.plusMinutes(i).toString("yyyy-MM-dd HH:mm:ss");
            mi.add(curTime);
        }





        for (int o = 0; o <list.size() ; o++) {
            if (yue.equals("%Y-%m")) {
                //查询的是月
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();
                BigDecimal bg = new BigDecimal(d);
                double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                Integer s3= r.nextInt(30)+1;
                for (int i = 0; i <arr.length ; i++) {
                    if(name.equals("")||name==null){
                        son.put("名字", "机加车间末端");
                    }else{
                        son.put("名字", name);
                    }
                }


                String [] am= list.get(o).split("-");
                son.put("粒度", am[0]+"-"+am[1]);
                son.put("实时流量", f1);
                son.put("实时压力", s3);
                son.put("累积流量", s3);


                son.put("压力",s3);
                son.put("温度",s3);
                son.put("瞬时流量",s3);
                son.put("反向流量",s3);
                finalResult.add(son);
            }
        }


        for (int i = 0; i <ho.size() ; i++) {
            if (shi.equals("%Y-%m-%d %H")) {//查询的是时 %Y-%m-%d %H
                Random r = new Random();
                Double d= r.nextDouble();
                BigDecimal bg = new BigDecimal(d);
                double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                Integer s3= r.nextInt(30)+1;
                Map son = new LinkedHashMap();
                if(name.equals("")||name==null){
                    son.put("名字", "机加车间末端");
                }else{
                    son.put("名字", name);
                }
                son.put("粒度", ho.get(i));
                son.put("实时流量", f1);
                son.put("实时压力", s3);
                son.put("累积流量", s3);

                son.put("压力",s3);
                son.put("温度",s3);
                son.put("瞬时流量",s3);
                son.put("反向流量",s3);
                finalResult.add(son);
            }
        }

        for (int i = 0; i <mi.size() ; i++) {
            if (fen.equals("%Y-%m-%d %H:%i")) {//查询的是分
                Random r = new Random();
                Double d= r.nextDouble();
                BigDecimal bg = new BigDecimal(d);
                double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                Integer s3= r.nextInt(30)+1;
                Map son = new LinkedHashMap();
                if(name.equals("")||name==null){
                    son.put("名字", "机加车间末端");
                }else{
                    son.put("名字", name);
                }
                son.put("粒度", mi.get(i));
                son.put("实时流量", f1);
                son.put("实时压力", s3);
                son.put("累积流量", s3);

                son.put("压力",s3);
                son.put("温度",s3);
                son.put("瞬时流量",s3);
                son.put("反向流量",s3);
                finalResult.add(son);
            }
        }
        for (int i = 0; i <l.size() ; i++) {
            if (fen.equals("%Y-%m-%d")) {//查询的是天
                Map son = new LinkedHashMap();
                Random r = new Random();
                Double d= r.nextDouble();
                BigDecimal bg = new BigDecimal(d);
                double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
                Integer s3= r.nextInt(30)+1;
                if(name.equals("")||name==null){
                    son.put("名字", "机加车间末端");
                }else{
                    son.put("名字", name);
                }
                String [] mk= l.get(i).split(" ");
                son.put("粒度", mk[0]);
                son.put("实时流量", f1);
                son.put("实时压力", s3);
                son.put("累积流量", s3);

                son.put("压力",s3);
                son.put("温度",s3);
                son.put("瞬时流量",s3);
                son.put("反向流量",s3);
                finalResult.add(son);

            }
        }




        return finalResult;

    }

    /**
     * 累积气量 分钟处理数据
     * @param datass
     * @param dbResult
     * @return
     */
    public List handlerDataForGasUseForMinute(List<Map> datass, List<Map> dbResult, String mode) {

        List<Map<String,Object>> finalResult = new ArrayList<>();
        // 获取对应的数据
        Map curTitleMap = datass.get(0);
        List l = new ArrayList<>();
       Object s= curTitleMap.get("ids");
        List<Object> ids  = new ArrayList<>();
       ids.add(s);

        for (int i = 0; i < ids.size(); i++) {
            Object curId = ids.get(i);
            Map saveMap = new HashMap();
            final BigDecimal[] sumTotal = { new BigDecimal(0) };
            // 提取 当前id的数据
            List<Map> curDatas = dbResult.stream().filter(sons -> sons.get("devId").toString().equals(curId)).collect(Collectors.toList());
            // 按时间顺序组装
            curDatas.forEach(num -> {
                String saveKey = subStringTime(mode, num.get("timeRecord").toString());
                saveMap.put(saveKey, new BigDecimal(num.get("useNum").toString()).setScale(2, RoundingMode.HALF_UP));
                sumTotal[0] = sumTotal[0].add(new BigDecimal(num.get("useNum").toString()));
            });
            // 插入总数 和 设备ID
            saveMap.put("total", sumTotal[0].setScale(2, RoundingMode.HALF_UP));
            saveMap.put("devId", curId);
            saveMap.put("name", changeForName((String)curId));
            finalResult.add(saveMap);
        }

        // 计算汇总车间数据
        Map allWorkshopMap = finalResult.stream().filter(map -> !map.get("devId").equals("104")).flatMap(map -> map.entrySet().stream()).filter(mm -> !"devId".equals(mm.getKey()) && !"name".equals(mm.getKey())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldOne, newOne)->{
            return new BigDecimal(oldOne.toString())
                           .add(new BigDecimal(newOne.toString()).setScale(2, RoundingMode.HALF_UP));
        }, HashMap::new));
        allWorkshopMap.put("devId", "160");
        allWorkshopMap.put("name", changeForName("160"));
        finalResult.add(allWorkshopMap);

        // 计算车间用量/总管用量 占比
        Map usePercentMap = finalResult.stream().filter(map -> map.get("devId").equals("104") || map.get("devId").equals("160"))
                                       .flatMap(map -> map.entrySet().stream())
                                       .filter(mm -> !"devId".equals(mm.getKey()) && !"name".equals(mm.getKey()))
                                       .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                                               (oldOne, newOne) -> {

                                                   BigDecimal oldNum = new BigDecimal(oldOne.toString());
                                                   BigDecimal newNum = new BigDecimal(newOne.toString());
                                                   DecimalFormat format = new DecimalFormat("0.00%");
//                                                   if (oldNum.compareTo(newNum) == 1) {
                                                       return format.format(newNum.divide(oldNum, 4, RoundingMode.HALF_UP).doubleValue());
//                                                   }

                                               }, HashMap::new));
        usePercentMap.put("devId", "162");
        usePercentMap.put("name", changeForName("162"));
        finalResult.add(usePercentMap);


        // 给总管一个devId ，依靠 车间汇总
        finalResult.get(0).put("devId", "161");

        // 按照一定的 顺序进行排序
        finalResult = finalResult.stream().sorted(Comparator.comparing(o -> o.get("devId").toString())).collect(Collectors.toList());

        return finalResult;

    }


    public String subStringTime (String mode, String time) {

        String result = "";

        switch (mode) {
            case "%Y-%m-%d %H:%i":
                result = time.substring(14, 16);
                break;
            case "%Y-%m-%d %H":
                result = time.substring(11, 13);
                break;
            case "%Y-%m-%d":
                result = time.substring(8, 10);
                break;
            case "%Y-%m":
                result = time.substring(5, 7);
                break;
            default:
                break;
        }

        return result;
    }

    public String changeForName (String id) {

        String name = "";
        switch (id) {
            case "104":
                name = "供气总管";
                break;
            case "153":
                name = "树脂车间";
                break;
            case "154":
                name = "机加车间";
                break;
            case "155":
                name = "冲压车间";
                break;
            case "156":
                name = "焊装车间";
                break;
            case "157":
                name = "涂装车间";
                break;
            case "158":
                name = "总装车间";
                break;
            case "159":
                name = "铸造车间";
                break;
            case "160":
                name = "车间汇总";
                break;
            case "162":
                name = "车间汇总/供气总管";
                break;
            default:
                break;
        }

        return name;
    }


}
